package com.szit.test.dao;

import java.sql.*;

/**
 * 功能：通用MySql数据库连接操作类
 *
 * @author 勇哥
 * @version 1.0 2025-05-15
 */
public class MySqlConnection {
    // 定义属性：将数据库的三个对象定义为私有属性
    private Connection cn;
    private PreparedStatement pstmt;
    private ResultSet rs;

    /**
     * 创建连接
     *
     * @return 返回一个活动连接对象
     */
    public Connection getConnection(){
        try {
            // 1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2.创建连接：通过驱动管理创建连接
            cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/flowers?serverTimezone=GMT-8&characterEncoding=utf8", "root", "root");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }

        return cn;
    }

    /**
     * 增删改数据
     *
     * @param sql SQL语句
     * @param parameters 命令对象的参数集合
     * @return 返回是否增删改成功
     */
    public boolean execute(String sql,Object[]parameters) {
        boolean isSuccess = false;

        try {
            // 1.获取连接
            this.getConnection();

            // 2.创建命令对象
            pstmt = cn.prepareStatement(sql);

            // 3.将参数添加到命令对象中
            if(parameters != null){
                for(int i=0;i<parameters.length;i++){
                    pstmt.setObject(i+1,parameters[i]);
                }
            }

            // 4.执行命令
            pstmt.executeUpdate();

            // 5.关闭对象
            this.close();

            isSuccess = true;
        }catch (SQLException e){
            e.printStackTrace();
        }

        return isSuccess;
    }

    /**
     * 查询数据
     *
     * @param sql SQL语句
     * @param parameters 命令对象的参数集合
     * @return 返回ResultSet结果集
     */
    public ResultSet getResultSet(String sql,Object[]parameters) {
        try {
            // 1.获取连接
            this.getConnection();

            // 2.创建命令对象
            pstmt = cn.prepareStatement(sql);

            // 3.将参数添加到命令对象中
            if(parameters != null){ // 判断为null，便于区分某些SQL语句不带参数执行
                for(int i=0;i<parameters.length;i++){
                    pstmt.setObject(i+1,parameters[i]);
                }
            }

            // 4.执行命令
            rs = pstmt.executeQuery();

            // 5.千万不能关闭对象
        }catch (SQLException e){
            e.printStackTrace();
        }

        return rs;
    }

    /**
     * 关闭三个对象
     *
     */
    public void close(){
        try {
            if(rs != null) {
                rs.close();
            }
            if(pstmt != null) {
                pstmt.close();
            }
            if(cn != null) {
                cn.close();
            }
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}
